package com.dubbo.common;

import java.math.BigDecimal;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

/**
 * 数学计算工具
 * 
 * @author chenwei
 * @date 2018年4月4日 下午3:43:37
 */
public final class MathUtils {
	/**
	 * 超大浮点乘法运算,保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:38:00
	 * @param factorA
	 *            因数1
	 * @param factorB
	 *            因数2
	 * @return
	 * @throws Exception
	 */
	public static String multiply(String factorA, String factorB) {
		if (!StringUtils.isNotBlank(factorA)) {
			factorA = "0";
		}
		if (!StringUtils.isNotBlank(factorB)) {
			factorB = "0";
		}
		BigDecimal a = new BigDecimal(factorA);
		BigDecimal b = new BigDecimal(factorB);
//		BigDecimal multiply = a.multiply(b).setScale(2, RoundingMode.DOWN);
//		BigDecimal multiply = a.multiply(b).setScale(2, BigDecimal.ROUND_UP);
		BigDecimal multiply = a.multiply(b);
		return fileZeroSuffix(multiply.toString());
	}
	
	
	/**
	 * 超大浮点除法运算
	 * @param v1
	 * @param v2
	 * @param scale 表示表示需要精确到小数点以后几位
	 * @return
	 */
	public static String div(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
    }
	/**
	 * 金额的超大浮点除法运算
	 * @param divisor 除数
	 * @param dividend 被除数
	 * @return
	 */
	public static String division(String divisor, String dividend) {
		BigDecimal b1 = new BigDecimal(divisor);
		BigDecimal b2 = new BigDecimal(dividend);
		return fileZeroSuffix(b1.divide(b2, 3).toString());
	}
	

	/**
	 * 超大浮点多参数相乘 保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:47:53
	 * @param factor
	 * @return
	 */
	public static String multiplys(List<String> factors) {
		BigDecimal base = new BigDecimal(new Double("1"));
		for (String string : factors) {
			if (!StringUtils.isNotBlank(string)) {
				string = "0";
			}
			base = base.multiply(new BigDecimal(string));
		}

//		base = base.setScale(2, BigDecimal.ROUND_UP);
//		base = base.setScale(2, RoundingMode.DOWN);
		return fileZeroSuffix(base.toString());
	}

	/**
	 * 超大浮点多参数相乘 保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:47:53
	 * @param factor
	 * @return
	 */
	public static String multiplys(String[] factors) {
		BigDecimal base = new BigDecimal(new Double("1"));
		for (String string : factors) {
			if (!StringUtils.isNotBlank(string)) {
				string = "0";
			}
			base = base.multiply(new BigDecimal(string));
		}

//		base = base.setScale(2, BigDecimal.ROUND_UP);
		return fileZeroSuffix(base.toString());
	}

	/**
	 * 超大浮点加法运算,保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:41:41
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String add(String num1, String num2) {
		if (!StringUtils.isNotBlank(num1)) {
			num1 = "0";
		}
		if (!StringUtils.isNotBlank(num2)) {
			num2 = "0";
		}
		BigDecimal a = new BigDecimal(num1);
		BigDecimal b = new BigDecimal(num2);
//		BigDecimal add = a.add(b).setScale(3, RoundingMode.UP);
//		String s = a.add(b).setScale(2, BigDecimal.ROUND_UP).toString();
		String s = a.add(b).toString();
//		BigDecimal add = a.add(b).setScale(2, RoundingMode.DOWN);
//		String s = add.toString();
		return fileZeroSuffix(s);
	}

	/**
	 * 超大浮点多参数相加 保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:53:24
	 * @param nums
	 * @return
	 */
	public static String adds(List<String> nums) {
		BigDecimal base = new BigDecimal(new Double("0"));
		for (String string : nums) {
			if (!StringUtils.isNotBlank(string)) {
				string = "0";
			}
			base = base.add(new BigDecimal(string));
		}

//		base.setScale(2, RoundingMode.DOWN);
//		base = base.setScale(2, BigDecimal.ROUND_UP);
		return fileZeroSuffix(base.toString());
	}

	/**
	 * 超大浮点多参数相加 保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:53:24
	 * @param nums
	 * @return
	 */
	public static String adds(String... nums) {
		BigDecimal base = new BigDecimal(new Double("0"));
		for (String string : nums) {
			if (!StringUtils.isNotBlank(string)) {
				string = "0";
			}
			base = base.add(new BigDecimal(string));
		}
//		base.setScale(2, RoundingMode.DOWN);
		return fileZeroSuffix(base.toString());
	}

	/**
	 * 过滤后搓零的字符
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:36:27
	 * @param s
	 * @return
	 */
	public static String fileZeroSuffix(String number) {
//		// 如果是正整数就直接返回
//		if (number.matches("[0-9]+")) {
//			return number;
//		}
//		if (number.substring(number.indexOf(".") + 1, number.length()).length() > 2) {
//			number = number.substring(0, number.indexOf(".") + 3);
//		}
//		if (number.substring(number.indexOf(".") + 1, number.length()).matches("0+")) {
//			return number.substring(0, number.indexOf("."));
//		}
//		if (number.substring(number.length() - 1, number.length()).equals("0")) {
//			return number.substring(0, number.length() - 1);
//		}
		if (number.indexOf(".") > 0) {
			String[] split = number.split("\\.");
			if(split.length > 1 && split[1].length() > 2) {//如果小数位超过2位则舍去
				number = split[0] + "." + split[1].substring(0, 2);
			}
			number = filterZeroAndPoint(number);//过滤掉多余的零和小数点
//			number = number.replaceAll("0+?$", "");// 去掉多余的0
//			number = number.replaceAll("[.]$", "");// 如最后一位是.则去掉
		}
		return number;
	}

	/**
	 * 超大浮点减法运算,保留两位小数,不进行四舍五入
	 * 
	 * @author chenwei
	 * @date 2018年4月4日 下午5:41:41
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String sub(String num1, String num2) {
		if (!StringUtils.isNotBlank(num1)) {
			num1 = "0";
		}
		if (!StringUtils.isNotBlank(num2)) {
			num2 = "0";
		}
		BigDecimal a = new BigDecimal(num1);
		BigDecimal b = new BigDecimal(num2);
//		a = a.subtract(b).setScale(2, RoundingMode.DOWN);
		return fileZeroSuffix(a.subtract(b).toString());
	}
	
	/**
	 * 过滤掉多余的零和小数点
	 * 
	 * @author chenwei
	 * @date 2019年3月25日 下午10:45:18
	 * @param price
	 * @return
	 */
	public static String filterZeroAndPoint(String price) {
		price = price.replaceAll("0+?$", "");// 去掉多余的0
		price = price.replaceAll("[.]$", "");// 如最后一位是.则去掉
		return price;
	}
//	public static void main(String[] args) throws Exception {
//		//
//		String num = "10.1000101142424";
//		num = fileZeroSuffix(num);
//		System.out.println(num);
////		//11111800×10.00
////		BigDecimal a = new BigDecimal("1111111");
////		BigDecimal b = new BigDecimal("4.35");
////		System.out.println(fileZeroSuffix(a.multiply(b).toString()));
////		System.out.println(b.toString());
//	}
	/**
	 * 判断金额指定小数点第几位数是否大于指定的值
	 * 
	 * @author chenwei
	 * @date 2019年3月25日 下午11:01:43
	 * @param num
	 * @param afterPoint 小数点后第几位数
	 * @param greaterThanNumber 指定大于的值
	 * @return boolean ->  true 大于 ,false 不大于
	 */
	public static boolean checkGreaterThan(String num,int afterPoint,int greaterThanNumber ) {
		String[] split = num.split("\\.");
		if(split.length > 1 && split[1].length() >= afterPoint) {
			if(Integer.parseInt(split[1].toCharArray()[afterPoint - 1] + "") > greaterThanNumber) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 保留两位小数，如果有第三位小数则+0.01
	 * @deprecated 不适用于大数额计算
	 * @author gujiahua
	 * 2019年2月28日 上午11:09:20
	 * @param num
	 * @return
	 */
	@Deprecated
	public static String mathDoubleUtils(String num){
		if (!StringUtils.isNotBlank(num)) {
			num = "0";
		}
		Double f = Double.parseDouble(num);
		int a = (int) (f * 1000);
		if (a % 10 > 0){
			f = (a - a % 10 + 10 * 1.0f) / 1000.0d;
		}
		else{
			f = a * 1.0f / 1000.0d;
		}
		return f.toString();
	}
}
